Problématique

Vision académique:

Être capable de faire une étude associative sur un nombre d’éléments fini permet de savoir extraire des informations sur les éléments à rapprocher ou à séparer quel que soit le domaine. Une étude associative son mon clavier, par exemple, pourrait extraire les lettres les plus utilisées et donc mènerait à une solution pour générer un layout de clavier maximisant ma vitesse d’écriture, comme par exemple le clavier Dvorak.

Vision métier:

Nous disposons de plusieurs jeux de données concernant le contenu de chariots. L’intérêt est de savoir quels produits sont généralement trouvés ensemble afin d’être capables de mieux cibler nos clients, en mettant des offres groupant les produits qui se trouvent ensemble ou de les mettre côte à côte dans les rayons. Le tout ayant pour objectif de maximiser l’achat et donc le profit.

Récupération des données

library(arules)
## Warning: package 'arules' was built under R version 3.4.3
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
library(TSP)
## Warning: package 'TSP' was built under R version 3.4.3
library(arulesViz)
## Warning: package 'arulesViz' was built under R version 3.4.3
## Loading required package: grid
library(DT)
## Warning: package 'DT' was built under R version 3.4.3
df_groceries_3_1 <- read.table("analyse_chariots_3_1.csv", header=T,fill=T, encoding="utf-8", sep=";", dec=".",quote = "", na.string="" )
df_groceries_3_1[1:10,1:10]
##    Hair_Conditioner Lemons Standard_coffee Frozen_Chicken_Wings
## 1                 0      0               0                    0
## 2                 0      0               0                    0
## 3                 0      0               0                    0
## 4                 0      0               0                    0
## 5                 0      0               0                    0
## 6                 0      0               0                    0
## 7                 0      0               0                    0
## 8                 0      0               0                    0
## 9                 0      0               0                    0
## 10                0      0               0                    0
##    X98pct_Fat_Free_Hamburger Sugar_Cookies Onions Deli_Ham
## 1                          0             0      0        0
## 2                          0             0      0        0
## 3                          0             0      0        0
## 4                          0             0      0        0
## 5                          0             0      0        0
## 6                          0             0      0        0
## 7                          0             0      0        0
## 8                          1             0      0        0
## 9                          0             0      0        0
## 10                         0             0      0        0
##    Dishwasher_Detergent Beets
## 1                     0     0
## 2                     0     0
## 3                     0     0
## 4                     0     0
## 5                     0     0
## 6                     0     0
## 7                     0     0
## 8                     0     0
## 9                     0     0
## 10                    0     0

Préparation des données

Pour passer à un authentique format transactionnel (qu’on pourra utiliser dans nos algorithmes), on doit transformer toutes nos colonnes en “logical”, c’est à dire une succession de vrai ou de faux

for(b in colnames(df_groceries_3_1)) df_groceries_3_1[[b]] <- as.logical(df_groceries_3_1[[b]])
trans <- as(df_groceries_3_1, "transactions")
trans
## transactions in sparse format with
##  1361 transactions (rows) and
##  303 items (columns)

Modélisation

On va essayer deux algorithmes différents, eclat et apriori.

Nos études nous ont montré que:

ECLAT représente une amélioration par rapport à apriori dans l’extraction de groupes d’objets fréquents, puisque l’algorithme apriori a besoin de scanner la base plusieurs fois pour calculer le support, mais pas ECLAT.

ECLAT n’extrait pas de règles, contrairement à apriori. Il extrait plutôt les groupes d’objets fréquents. Cela bien sûr peut être utilisé par ruleInduction pour extraire les règles.

Apriori fonctionne plus rapidement qu’ECLAT dans des datasets avec beaucoup de transactions mais peu de types d’objets, alors qu’ECLAT fonctionne mieux avec des datasets au nombre de transactions limité, mais avec plus d’objets.

basket_rules<-apriori(trans,parameter=list(sup=0.03,conf=0.6,target="rules"))
basket_eclat <- eclat(trans, parameter = list(support = 0.03, tidLists = TRUE))
basket_rules_eclat <- ruleInduction(basket_eclat, trans, confidence = 0.6)

Les règles extraites sont bidirectionnelles. On va retirer les règles redondantes.

Pour apriori

sub.matrix=is.subset(basket_rules,basket_rules,sparse = FALSE)
sub.matrix[lower.tri(sub.matrix,diag = TRUE)] <- NA
redundant=colSums(sub.matrix,na.rm = TRUE)>=1
NewRules<-basket_rules[!redundant]
inspect(head(sort(NewRules, by ="lift"),10))
##      lhs                            rhs                            support confidence     lift count
## [1]  {Hot_Dog_Buns}              => {Hot_Dogs}                  0.04188097  0.7125000 7.696131    57
## [2]  {Hamburger_Buns}            => {X98pct_Fat_Free_Hamburger} 0.04849375  0.6804124 7.291663    66
## [3]  {Hot_Dog_Buns}              => {Sweet_Relish}              0.03600294  0.6125000 7.186315    49
## [4]  {Eggs,                                                                                         
##       Wheat_Bread}               => {White_Bread}               0.03012491  0.7454545 6.262738    41
## [5]  {Beer_And_Potato_Juice,                                                                        
##       Cola}                      => {White_Bread}               0.03012491  0.7454545 6.262738    41
## [6]  {Eggs,                                                                                         
##       Cola}                      => {White_Bread}               0.03012491  0.7454545 6.262738    41
## [7]  {Beer_And_Potato_Juice,                                                                        
##       Wheat_Bread}               => {White_Bread}               0.03159442  0.7413793 6.228501    43
## [8]  {Potato_Chips,                                                                                 
##       Beer_And_Potato_Juice}     => {White_Bread}               0.03306392  0.7377049 6.197632    45
## [9]  {Potato_Chips,                                                                                 
##       Beer_And_Potato_Juice}     => {Eggs}                      0.03379868  0.7540984 6.145676    46
## [10] {X98pct_Fat_Free_Hamburger,                                                                    
##       Potato_Chips}              => {White_Bread}               0.03085966  0.7118644 5.980540    42

et pour ECLAT

sub.matrix=is.subset(basket_rules_eclat,basket_rules_eclat,sparse = FALSE)
sub.matrix[lower.tri(sub.matrix,diag = TRUE)] <- NA
redundant_eclat=colSums(sub.matrix,na.rm = TRUE)>=1
NewRules_eclat<-basket_rules_eclat[!redundant_eclat]
inspect(head(sort(NewRules_eclat, by ="lift"),10))
##      lhs                        rhs                            support confidence     lift itemset
## [1]  {Hot_Dog_Buns,                                                                               
##       Sweet_Relish}          => {Hot_Dogs}                  0.03012491  0.8367347 9.038063      13
## [2]  {Hot_Dog_Buns}          => {Hot_Dogs}                  0.04188097  0.7125000 7.696131      14
## [3]  {Hamburger_Buns}        => {X98pct_Fat_Free_Hamburger} 0.04849375  0.6804124 7.291663       5
## [4]  {Hot_Dog_Buns}          => {Sweet_Relish}              0.03600294  0.6125000 7.186315      15
## [5]  {Eggs,                                                                                       
##       Wheat_Bread}           => {Beer_And_Potato_Juice}     0.03085966  0.7636364 6.975229      83
## [6]  {White_Bread,                                                                                
##       Cola}                  => {Beer_And_Potato_Juice}     0.03012491  0.7454545 6.809152      95
## [7]  {White_Bread,                                                                                
##       Wheat_Bread}           => {Beer_And_Potato_Juice}     0.03159442  0.7288136 6.657149      82
## [8]  {Beer_And_Potato_Juice,                                                                      
##       Eggs}                  => {Potato_Chips}              0.03379868  0.6478873 6.629885     149
## [9]  {Beer_And_Potato_Juice,                                                                      
##       White_Bread}           => {Potato_Chips}              0.03306392  0.6428571 6.578410     148
## [10] {White_Bread,                                                                                
##       Toothpaste}            => {Potato_Chips}              0.03012491  0.6307692 6.454714     140

Visualisation des résultats

ECLAT

inspectDT(NewRules_eclat)
plotly_arules(NewRules_eclat)

Associations extraites d’ECLAT

Hot_Dog_Buns,Sweet_Relish,Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs. Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés

Hot_Dog_Buns,Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs.

Hamburger_Buns, Fat_Free_Hamburger: Lorsqu’on achète du pain de hamburger, on achète aussi du hamburger sans graisse.

Hot_Dog_Buns,Sweet_Relish: Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés

Eggs,Wheat_Bread,Beer_And_Potato_Juice: Le pain de blé et les oeufs indiquent un comportement de personne vivant seule et cuisinant vite. Cela est renforcé par la présence du bundle “Bière et jus de patate”

White_Bread,Cola,Beer_And_Potato_Juice: Le bundle “Bière et jus de patate” est très prisé avec le coca et le pain de mie. C’est explicable quand on sait qu’on peut faire des apéritifs avec le pain de mie, et que quand on achète des boissons alcoolisées pour soit, il faut bien prendre une boisson pour la famille.

White_Bread,Wheat_Bread,Beer_And_Potato_Juice: Le bundle “Bière et jus de patate” est très prisé avec le pain de mie pour les raisons expliquées ci dessus. Le pain de mie est lui même associé au pain de blé parce que le pain est généralement dans le même rayon.

Beer_And_Potato_Juice,Eggs,Potato_Chips: Là, ça rejoint tant l’esprit “soirée entre amis” que l’esprit “repas du célibataire”

White_Bread,Toothpaste,Potato_Chips: Règle intéressante: Ceux qui mangent des chips ont peur pour leur haleine.

APRIORI

inspectDT(NewRules)
plotly_arules(NewRules)

Associations extraites d’APRIORI

Hot_Dog_Buns et Hot_Dogs: Lorsqu’on achète des hot dogs, on achète aussi le pain des hot dogs.

Hamburger_Buns et Fat_Free_Hamburger: Lorsqu’on achète du pain de hamburger, on achète aussi du hamburger sans graisse.

Hot_Dog_Buns Sweet_Relish: Lorsqu’on achète du painde hot dogs, on achète aussi des cornichons sucrés

Eggs, Wheat_Bread, White_Bread: Lorsqu’on achète du pain de blé, on achète aussi du pain de mie et des oeufs. Rien d’étonnant pour le pain de blé et le pain de mie car le pain est généralement dans un seul rayon.

Beer_And_Potato_Juice, Cola, White_Bread: Le bundle “Bière et jus de patate” est très prisé avec le coca et le pain de mie. C’est explicable quand on sait qu’on peut faire des apéritifs avec le pain de mie, et que quand on achète des boissons alcoolisées pour soit, il faut bien prendre une boisson pour la famille.

Eggs, Cola, White_Bread: Des oeufs, du pain et du soda. Ou le repas du célibataire

Beer_And_Potato_Juice,Wheat_Bread White_Bread: Le bundle “Bière et jus de patate” est très prisé avec le pain de mie pour les raisons expliquées ci dessus. Le pain de mie est lui même associé au pain de blé pour les raisons associées ci dessus.

Potato_Chips,Beer_And_Potato_Juice White_Bread: Les chips, le bundle “Bière et jus de patate” et le pain de mie. Encore une fois, l’esprit de l’apéritif pour les chips et le pain de mie.

Potato_Chips, Beer_And_Potato_Juice, Eggs: Là, ça rejoint tant l’esprit “soirée entre amis” que l’esprit “repas du célibataire”

Fat_Free_Hamburger,Potato_Chips White_Bread: Hamburger, Chips et pain de mie. Autre version populaire du repas du célibataire.

Conlusion générale

L’étude a montré des associations claires entre le pain et la bière, mais aussi entre le pain et les oeufs, la bière et le coca, et surtout les chips et les brosses à dent.

En mettant ces produits dans des rayons adjacent, on pourrait encourager l’achat et donc augmenter les ventes.